use std::{env, fs};
use std::path::Path;
use std::process::Command;
use std::error::Error;

// 用于解析 toml
use toml::Value;

fn ensure_target_installed(target: &str) {
    // 获取已安装的 target 列表
    let output = Command::new("rustup")
        .args(["target", "list", "--installed"])
        .output()
        .expect("无法执行 rustup，请确保 rustup 已安装");

    let installed = String::from_utf8_lossy(&output.stdout);
    if installed.contains(target) {
        // 已安装，不显示任何信息
        return;
    }

    // 只在需要安装时才显示警告
    println!("cargo:warning=🚀 Target '{}' 未安装，正在自动安装...", target);
    let status = Command::new("rustup")
        .args(["target", "add", target])
        .status()
        .expect("无法执行 rustup target add");

    if status.success() {
        println!("cargo:warning=✅ Target '{}' 安装成功", target);
    } else {
        println!("cargo:warning=❌ Target '{}' 安装失败，请手动安装", target);
    }
}

fn ensure_config_load() {
    // 项目根目录
    let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
    // 我们要复制的目标路径，比如 release/config/
    let config_dir = Path::new(&manifest_dir).join("release").join("config");
    let src_file = Path::new(&manifest_dir).join("config.toml");
    let dest_file = config_dir.join("config.toml");

    // 创建目录
    if let Err(e) = fs::create_dir_all(&config_dir) {
        eprintln!("创建 config 目录失败: {:?}", e);
    }

    // 拷贝文件（静默执行，不显示警告）
    if let Err(e) = fs::copy(&src_file, &dest_file) {
        eprintln!("复制 config.toml 失败: {:?}", e);
    }
    // 成功时不显示警告

    // 确保 build.rs 每次都会执行
    println!("cargo:rerun-if-changed=config.toml");
}

fn installed_targets() -> Result<(), Box<dyn Error>> {
    let manifest_dir = std::env::var("CARGO_MANIFEST_DIR")?;
    let config_path = Path::new(&manifest_dir).join(".cargo").join("config.toml");

    if !config_path.exists() {
        println!("cargo:warning=⚠️ 未找到 .cargo/config.toml，跳过自动安装 target");
        return Ok(());
    }

    let content = fs::read_to_string(&config_path)?;
    let value: Value = toml::from_str(&content)?;

    // 优先读取 build.target
    if let Some(build_target) = value.get("build").and_then(|b| b.get("target")).and_then(|v| v.as_str()) {
        ensure_target_installed(build_target);
    }

    // 再读取我们自定义的 package.metadata.targets.list（可选多个）
    if let Some(list) = value
        .get("package")
        .and_then(|p| p.get("metadata"))
        .and_then(|m| m.get("targets"))
        .and_then(|t| t.get("list"))
        .and_then(|arr| arr.as_array())
    {
        for item in list {
            if let Some(target_str) = item.as_str() {
                ensure_target_installed(target_str);
            }
        }
    }

    println!("cargo:rerun-if-changed=.cargo/config.toml");
    Ok(())
}


fn main() -> Result<(), Box<dyn Error>> {
    installed_targets()?;
    ensure_config_load();
    Ok(())
}